package de.hdu.tennis.dao;


import de.hdu.tennis.model.Mitglied;
import de.hdu.tennis.model.Reservierung;
import de.hdu.tennis.model.Tennisplatz;
import java.util.Date;
import org.apache.log4j.Logger;

/**
 * Testclass for ReservierungDao
 * @see ReservierungDao
 * @author Lilli Kardapolzew, Katharina Weber, Carolina Hirtreiter
 */
public class ReservierungDaoTest extends AbstractDataAccessTest {

    private ReservierungDao reservierungDao;
    private TennisplatzDao tennisplatzDao;
    private MitgliedDao mitgliedDao;
 
    private Reservierung reservierung1;
    private Reservierung reservierung2;
    private Mitglied mitglied1;
    private Tennisplatz tennisplatz1;
    private String tableName = "tbl_reservierung";
    private static Logger log = Logger.getLogger(ReservierungDaoTest.class);

    public ReservierungDaoTest() {
    }

    @Override
    protected void onSetUpBeforeTransaction() throws Exception {
        log.info("Initialisierung ReservierungObjekte");

        String[] tables = { tableName };
    	deleteFromTables(tables);
        
        mitglied1 = new Mitglied();
        mitglied1.setNachname("Mustermann");
		mitglied1.setVorname("Max");
		mitglied1.setStrasse("Bahnhofweg 2");
		mitglied1.setPlz("94125");
		mitglied1.setOrt("Deggendorf");
		mitglied1.setTelefon("0941 25846");
		mitglied1.setEmail("maxmustermann@gmx.de");
		mitglied1.setPasswort("123");
		mitglied1.setIsAdmin(true);

        // kunde1 neu belegen um Zugriff auf ID zu erhalten
        mitglied1 = mitgliedDao.save(mitglied1);

        tennisplatz1 = new Tennisplatz();
        tennisplatz1.setBelegt(false);
        tennisplatz1.setZustand("Ok");
        tennisplatz1.setName("Platz1");

        // tennisplatz1 neu belegen um Zugriff auf ID zu erhalten
        tennisplatz1 = tennisplatzDao.save(tennisplatz1);

        reservierung1 = new Reservierung();
        reservierung1.setMitglied(mitglied1);
        reservierung1.setTennisplatz(tennisplatz1);
        reservierung1.setStartres(new Date(System.currentTimeMillis()));
        reservierung1.setEndres(new Date((System.currentTimeMillis() + 100000)));

    }

 /*   *//**
     * Mitglied und Tennisplatz nach erfolgreichem Test wieder l�schen (nicht im Rollback enthalten)
     * @throws Exception 
     *//*
    @Override
    protected void onTearDownAfterTransaction() throws Exception {
        log.info("Initialisierung ReservierungObjekte");
 //      mitgliedDao.delete(mitglied1);
        tennisplatzDao.delete(tennisplatz1);
    }*/

    /**
     * Test of save method, of class ReservierungDao.
     */
    @SuppressWarnings("deprecation")
	public void testSave() {
        logger.info("Save");
        reservierungDao.save(reservierung1, 1, 1 );
        assertEquals("Die Tabelle muss einen Eintrag enthalten", 1, countRowsInTable(tableName));
    }

    /**
     * Test of findAll method, of class ReservierungDao.
     */
    @SuppressWarnings("deprecation")
	public void testFindAll() {
        logger.info("FindAll");
        reservierungDao.save(reservierung1, 1, 1);
        assertEquals("Die Tabelle muss einen Eintrag enthalten", 1, countRowsInTable(tableName));
    }

    /**
     * Test of delete method, of class ReservierungDao.
     */
    @SuppressWarnings("deprecation")
	public void testDelete() throws Exception {
        logger.info("delete");
        Reservierung tmp = reservierungDao.save(reservierung1, 1, 1);
        reservierungDao.delete(tmp);
        assertNull("Die Reservierung darf nicht mehr existieren", reservierungDao.findById(tmp.getId()));
    }

    /**
     * Test of findById method, of class ReservierungDao.
     */
    @SuppressWarnings("deprecation")
	public void testFindById() {
        logger.info("findById");
        Reservierung tmp = reservierungDao.save(reservierung1, 1, 1);
        assertEquals("Die Reservierung muss existieren", tmp, reservierungDao.findById(tmp.getId()));
    }

//    /**
//     * Test of getReservierungenInZeitraum method, of class ReservierungDao.
//     */
//    @SuppressWarnings("deprecation")
//	public void testGetReservierungenInZeitraum() {
//        logger.info("getReservierungenInZeitraum");
//        reservierungDao.save(reservierung1, 1, 1);
//        assertEquals("Es muss eine Reservierung existieren", 1, reservierungDao.getReservierungen(reservierung1).size());
//    }

    /**
     * @return the reservierungDao
     */
    public ReservierungDao getReservierungDao() {
        return reservierungDao;
    }

    /**
     * @param reservierungDao the reservierungDao to set
     */
    public void setReservierungDao(ReservierungDao reservierungDao) {
        this.reservierungDao = reservierungDao;
    }

    /**
     * @return the tennisplatzDao
     */
    public TennisplatzDao getTennisplatzDao() {
        return tennisplatzDao;
    }

    /**
     * @param tennisplatzDao the tennisplatzDao to set
     */
    public void setTennisplatzDao(TennisplatzDao tennisplatzDao) {
        this.tennisplatzDao = tennisplatzDao;
    }

    /**
     * @return the mitgliedDao
     */
    public MitgliedDao getMitgliedDao() {
        return mitgliedDao;
    }

    /**
     * @param mitgliedDao the mitgliedDao to set
     */
    public void setMitgliedDao(MitgliedDao mitgliedDao) {
        this.mitgliedDao = mitgliedDao;
    }
}